import { getToken, setToken, removeToken, setCookieTime } from '@/utils/auth'
import { login, getUserInfo, getDetailsInfo } from '@/api/user'
import { resetRouter } from '@/router'
// 状态
const state = {
  token: getToken(),
  userInfo: {}
}

// 修改状态
const mutations = {

  setToken(state, token) { // 设置token
    state.token = token
    setToken(token)
  },

  removeToken(state) { // 删除缓存
    state.token = null // 删除vuex的token
    removeToken() // 删除cookie里面的 token
  },

  setUserInfo(state, result) { // 设置 用户信息
    state.userInfo = result
  },

  removeUserInfo(state) { // 删除用户信息
    state.userInfo = {}
  }
}
// 执行异步
const actions = {
  //  获取 token
  async login({ commit }, data) {
    const result = await login(data) // 调用 传过来的 login 登录的 方法 上面的 login 是对象的 键,所以不会递归
    // 表示登录接口调用成功 也就是意味着你的用户名和密码是正确的
    // 如果为真 表示获取到了 token 调用 mutations 中的方法 更改state 里面的token 和设置缓存
    commit('setToken', result)
    setCookieTime() // 设置cookie 时间
  },
  // 获取用户数据
  async getUserInfo({ commit }) {
    // 获取用户 基本信息
    const res = await getUserInfo()
    // 获取用户详细信息
    const result = await getDetailsInfo(res.userId)
    commit('setUserInfo', { ...res, ...result })
    return res
  },
  // 退出登录
  logout(obj) {
    obj.commit('removeToken') // 删除用户token 和清楚缓存的 token
    obj.commit('removeUserInfo') // 删除用户信息
    resetRouter()// 重置路由
    obj.commit('permission/setRoutes', [], { root: true })
  }
}
export default {
  namespaced: true,
  state,
  mutations,
  actions
}
